<div id="maincontent">

<h1>ECMAScript 等性运算符</h1>

<div id="tpn">

</div>

<div>
<p><strong>判断两个变量是否相等是程序设计中非常重要的运算。在处理原始值时，这种运算相当简单，但涉及对象，任务就稍有点复杂。</strong></p>
<p><strong>ECMAScript 提供了两套等性运算符：等号和非等号用于处理原始值，全等号和非全等号用于处理对象。</strong></p>
</div>

<div>
<h2>等号和非等号</h2>

<p>在 ECMAScript 中，等号由双等号（==）表示，当且仅当两个运算数相等时，它返回 true。非等号由感叹号加等号（!=）表示，当且仅当两个运算数不相等时，它返回 true。为确定两个运算数是否相等，这两个运算符都会进行类型转换。</p>

<p>执行类型转换的规则如下：</p>

<ul>
<li>如果一个运算数是 Boolean 值，在检查相等性之前，把它转换成数字值。false 转换成 0，true 为 1。</li>
<li>如果一个运算数是字符串，另一个是数字，在检查相等性之前，要尝试把字符串转换成数字。</li>
<li>如果一个运算数是对象，另一个是字符串，在检查相等性之前，要尝试把对象转换成字符串。</li>
<li>如果一个运算数是对象，另一个是数字，在检查相等性之前，要尝试把对象转换成数字。</li>
</ul>

<p>在比较时，该运算符还遵守下列规则：</p>

<ul>
<li>值 null 和 undefined 相等。</li>
<li>在检查相等性时，不能把 null 和 undefined 转换成其他值。</li>
<li>如果某个运算数是 NaN，等号将返回 false，非等号将返回 true。</li>
<li>如果两个运算数都是对象，那么比较的是它们的引用值。如果两个运算数指向同一对象，那么等号返回 true，否则两个运算数不等。</li>
</ul>

<p class="tip"><span>重要提示：</span>即使两个数都是 NaN，等号仍然返回 false，因为根据规则，NaN 不等于 NaN。</p>

<p>下表列出了一些特殊情况，以及它们的结果：</p>

<table class="dataintable">
<tr>
<th>表达式</th>
<th>值</th>
</tr>

<tr>
<td>null == undefined</td>
<td>true</td>
</tr>

<tr>
<td>&quot;NaN&quot; == NaN</td>
<td>false</td>
</tr>

<tr>
<td>5 == NaN</td>
<td>false</td>
</tr>

<tr>
<td>NaN == NaN</td>
<td>false</td>
</tr>

<tr>
<td>NaN != NaN</td>
<td>true</td>
</tr>

<tr>
<td>false == 0</td>
<td>true</td>
</tr>

<tr>
<td>true == 1</td>
<td>true</td>
</tr>

<tr>
<td>true == 2</td>
<td>false</td>
</tr>

<tr>
<td>undefined == 0</td>
<td>false</td>
</tr>

<tr>
<td>null == 0</td>
<td>false</td>
</tr>

<tr>
<td>&quot;5&quot; == 5</td>
<td>true</td>
</tr>
</table>
</div>


<div>
<h2>全等号和非全等号</h2>

<p>等号和非等号的同类运算符是全等号和非全等号。这两个运算符所做的与等号和非等号相同，只是它们在检查相等性前，不执行类型转换。</p>

<p>全等号由三个等号表示（===），只有在无需类型转换运算数就相等的情况下，才返回 true。</p>

<p>例如：</p>

<pre>
var sNum = &quot;66&quot;;
var iNum = 66;
alert(sNum == iNum);	<span>//输出 &quot;true&quot;</span>
alert(sNum === iNum);	<span>//输出 &quot;false&quot;</span>
</pre>

<p>在这段代码中，第一个 alert 使用等号来比较字符串 &quot;66&quot; 和数字 66，输出 &quot;true&quot;。如前所述，这是因为字符串 &quot;66&quot; 将被转换成数字 66，，然后才与另一个数字 66 进行比较。第二个 alert 使用全等号在没有类型转换的情况下比较字符串和数字，当然，字符串不等于数字，所以输出 &quot;false&quot;。</p>

<p>非全等号由感叹号加两个等号（!==）表示，只有在无需类型转换运算数不相等的情况下，才返回 true。</p>

<p>例如：</p>

<pre>
var sNum = &quot;66&quot;;
var iNum = 66;
alert(sNum != iNum);	<span>//输出 &quot;false&quot;</span>
alert(sNum !== iNum);	<span>//输出 &quot;true&quot;</span>
</pre>

<p>这里，第一个 alert 使用非等号，把字符串 &quot;66&quot; 转换成数字 66，使得它与第二个运算数 66 相等。因此，计算结果为 &quot;false&quot;，因为两个运算数是相等的。第二个 alert 使用的非全等号。该运算是在问：&quot;sNum&quot; 与 &quot;iNum&quot; 不同吗？这个问题的答案是：是的（true），因为 sNum 是字符串，而 iNum 是数字，它们当然不同。</p>
</div>


<div id="bpn">

</div>




</div>
